package com.sky.controller.user;

import com.alibaba.fastjson.JSON;
import com.sky.result.Result;
import com.sky.service.DishService;
import com.sky.vo.DishVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author bairimengchang
 * @version 1.0
 * @project sky-take-out
 * @description C端菜品操作控制器
 * @date 2024/08/18 21:27:16
 */
@RestController("UserDishController")       //这里因为默认是单例bean，所以重命名一下，也可以修改类名
@RequestMapping("/user/dish")
@Slf4j
@Api(tags = "C端菜品浏览接口")
public class DishController {

    @Autowired
    private DishService dishService;

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 根据分类id查询菜品
     * @param categoryId 分类id
     * @return 该分类id下的所有菜品的结果对象
     */
    @ApiOperation("根据分类id查询菜品")
    @GetMapping("/list")
    public Result<List<DishVO>> getDishList(@RequestParam("categoryId") Long categoryId) {
        //要求是在售菜品才显示给客户
        log.info("根据分类id查询菜品");

        //redis的键用菜品_分类标识
        String key = "dish_" + categoryId;
        //加入菜品缓存机制
        // 1.从redis中获取菜品数据
        ////这里报黄是因为序列化器的问题，暂不修复
        List<DishVO> dishList = (List<DishVO>) redisTemplate.opsForValue().get(key);
        if (dishList != null && !dishList.isEmpty()) {
            log.info("从redis缓存中拿取菜品数据");
            // 2.如果存在，直接返回
            return Result.success(dishList);
        }
        // 3.如果不存在，查询数据库，将查询到的菜品数据缓存到redis中
        log.info("缓存中不存在菜品数据，查询数据库");
        List<DishVO> dishListByMySql = dishService.getDishVOByCategoryId(categoryId);
        redisTemplate.opsForValue().set(key, dishListByMySql);

        //返回数据库当中的数据
        return Result.success(dishListByMySql);
    }

}
